亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用漂亮的湯解析和排序 html 標簽

用漂亮的湯解析和排序 html 標簽

小怪獸愛吃肉 2022-06-14 16:44:24
我有以下 HTML 文件,其中包含bbox來自 PDF 文件的信息:<flow>  <block xMin="53.879997" yMin="369.965298" xMax="63.939976" yMax="380.991433">    <line xMin="53.879997" yMin="369.965298" xMax="63.939976" yMax="380.991433">      <word xMin="53.879997" yMin="369.965298" xMax="63.939976" yMax="380.991433">10</word>    </line>  </block></flow><flow>  <block xMin="53.879997" yMin="417.965298" xMax="63.939976" yMax="428.991433">    <line xMin="53.879997" yMin="417.965298" xMax="63.939976" yMax="428.991433">      <word xMin="53.879997" yMin="417.965298" xMax="63.939976" yMax="428.991433">20</word>    </line>  </block></flow><flow>  <block xMin="111.351361" yMin="369.965298" xMax="134.220382" yMax="380.991433">    <line xMin="111.351361" yMin="369.965298" xMax="134.220382" yMax="380.991433">      <word xMin="111.351361" yMin="369.965298" xMax="116.331548" yMax="380.991433">1</word>      <word xMin="121.909358" yMin="369.965298" xMax="134.220382" yMax="380.991433">PC</word>    </line>  </block></flow>以上是單詞的邊界框區域:10 20 1 PC在原始文檔中,是這樣寫的:10 1 PC20因此,我想解析上面的 HTML 文件并提取所有 <line>標簽,然后按yMin值對它們進行排序。上面的最終輸出將是:10 1 PC 20而不是。到目前為止我嘗試過的我不是很遠,因為我還在學習 Python。我正在使用 BeautifulSoup4:with open("test.html", "r") as f:    contents = f.read()    soup = BeautifulSoup(contents, 'lxml')    for line in soup.find_all("line", attrs={"ymin":True}):        print(line.get('ymin'))上面只是打印出每個標簽及其內容。我不確定如何對行標簽進行排序。任何幫助將不勝感激。
查看完整描述

2 回答

?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

您可以BeautifulSoup使用soup.find_all:


from bs4 import BeautifulSoup as soup

r = [i.find_all('word') for i in sorted(soup(html, 'html.parser').find_all('line'), key=lambda x:float(x['ymin']))]

result = [i.text for b in r for i in b]

輸出:


['10', '1', 'PC', '20']


查看完整回答
反對 回復 2022-06-14
?
冉冉說

TA貢獻1877條經驗 獲得超1個贊

試試下面的代碼??梢远x平均值,然后檢查平均值。


from bs4 import BeautifulSoup

html='''<flow>

  <block xMin="53.879997" yMin="369.965298" xMax="63.939976" yMax="380.991433">

    <line xMin="53.879997" yMin="369.965298" xMax="63.939976" yMax="380.991433">

      <word xMin="53.879997" yMin="369.965298" xMax="63.939976" yMax="380.991433">10</word>

    </line>

  </block>

</flow>

<flow>

  <block xMin="53.879997" yMin="417.965298" xMax="63.939976" yMax="428.991433">

    <line xMin="53.879997" yMin="417.965298" xMax="63.939976" yMax="428.991433">

      <word xMin="53.879997" yMin="417.965298" xMax="63.939976" yMax="428.991433">20</word>

    </line>

  </block>

</flow>

<flow>

  <block xMin="111.351361" yMin="369.965298" xMax="134.220382" yMax="380.991433">

    <line xMin="111.351361" yMin="369.965298" xMax="134.220382" yMax="380.991433">

      <word xMin="111.351361" yMin="369.965298" xMax="116.331548" yMax="380.991433">1</word>

      <word xMin="121.909358" yMin="369.965298" xMax="134.220382" yMax="380.991433">PC</word>

    </line>

  </block>

</flow>'''


soup=BeautifulSoup(html,'lxml')

pricemin=soup.select_one('line[yMin]')['ymin']

list1=[]

list_last=[]

for item in soup.select('line[yMin]'):

    if float(pricemin) < float(item['ymin']):


         for w in item.select('word'):

             list_last.append(w.text)

    else:

        for w in item.select('word'):

            list1.append(w.text)


print(list1+list_last)

輸出:


['10', '1', 'PC', '20']

打印這個


print(' '.join(list1+list_last))

輸出:


10 1 PC 20


查看完整回答
反對 回復 2022-06-14
  • 2 回答
  • 0 關注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號