整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          java 如何解析網頁?

          java 如何解析網頁?

          送HTTP請求:首先,你需要向目標網頁發送HTTP請求以獲取其HTML內容。這可以通過Java的內置庫java.net.HttpURLConnection或者使用更高級的庫如Apache HttpClient、OkHttp等來完成。

          讀取響應內容:一旦你發送了請求并收到了響應,你需要讀取響應的內容,這通常是HTML格式的字符串。

          解析HTML:然后,你需要解析HTML字符串以提取所需的信息。這可以通過正則表達式來完成,但通常建議使用專門的HTML解析庫,如Jsoup。Jsoup提供了一種非常方便的方式來解析HTML文檔,并可以通過類似于CSS或jQuery的選擇器語法來提取和操作數據。

          如果你需要處理更復雜的網頁或進行更高級的網頁抓取和解析任務,你可能還需要考慮使用如Selenium這樣的瀏覽器自動化工具來模擬真實的瀏覽器行為。但是,請注意,頻繁或大規模地抓取網頁可能會違反網站的使用條款,甚至可能構成法律問題。


          ext()方法會把包含的字符轉義處理,html()則不會.所謂轉義就是字符的另一種顯示方法,例如"<" 顯示成 "<",這就是轉義了,其中的<就是<的轉義字符.還有很多可以轉義的字符,可以搜索下看看.


          下邊是項目中用到的2個語句:span中包含了jquery的語句輸出結果.


          1. $('.title').text("<img src=" ">");


          顯示結果為<img src=" ">,這里的<img src=" ">不會被解析成html的img標簽,而是以存字母文字的形式顯示,也就是單純的字符串:<img src=" "> .并且f12查看源碼時看到span包含的<img src=" ">文字內容外層有雙引號哦.看下圖,


          ?


          如果你用右鍵選擇編輯為html,則看到其中的轉義字符<這就說明我們的<被轉移了,


          ?


          如果我們想把<img>顯示成標簽,被瀏覽器解析.那么就需要如下方法.



          2. $('.title').html("<img >");


          顯示結果為解析后的html代碼段,那么這里的<img >就會按照h5的標簽img圖片進行解析顯示了.下圖是f12的頁面代碼結果span中的<img>標簽外層無雙引號,且頁面此時會顯示出來圖片.


          ?



          ?

          xml是基于 libxml2解析庫的Python封裝。libxml2是使用C語言編寫的,解析速度很好,不過安裝起來稍微有點復雜。安裝說明可以參考(http: //Lxml.de/installation.html),在CentOS7上中文安裝說明(http://www.cjavapy.com/article/64/),使用lxml庫來解析網絡爬蟲抓取到的HTML是一種非常高效的方式。lxml的html模塊特別適合處理HTML內容,它可以快速解析大型HTML文件,并提供XPath和CSS選擇器來查詢和提取數據。

          參考文檔:https://www.cjavapy.com/article/65/

          一、可能不合法的html標簽解析

          從網絡上抓取到的html的內容,有可能都是標準寫法,標簽什么的都閉合,屬性也是標準寫法,但是有可能有的網站的程序員不專業,這樣抓到的html解析就有可能有問題,因此,解析時先將有可能不合法的html解析為統一的格式。避免為后續的解析造成困擾。

          1、lxml.html

          lxml.html是專門用于解析和處理HTML文檔的模塊。它基于lxml.etree,但是為HTML文檔的特點做了優化。lxml.html能夠處理不良形式的HTML代碼,這對于解析和爬取網頁尤其有用。

          >>> import lxml.html
          >>> broken_html='<ul class="body"><li>header<li>item</ul>'
          >>> tree=lxml.html.fromstring(broken_html) #解析html
          >>> fixed_html=lxml.html.tostring(tree,pretty_print=True)
          >>> print fixed_html
          <ul class="body">
          <li>header</li>
          <li>item</li>
          </ul>

          2、lxml.etree

          lxml.etree是lxml庫中用于處理XML文檔的模塊。它基于非常快的XML解析庫libxml2,提供了一個類似于標準庫xml.etree.ElementTreeAPI的接口,但是在性能和功能性方面要更加強大。lxml.etree支持XPath、XSLT、和Schema驗證等高級XML特性。

          >>> import lxml.etree
          >>> broken_html='<ul class="body"><li>header<li>item</ul>'
          >>> tree=lxml.etree.fromstring(broken_html) #解析html
          >>> fixed_html=lxml.etree.tostring(tree,pretty_print=True)
          >>> print fixed_html
          <ul class="body">
          <li>header</li>
          <li>item</li>
          </ul>

          通過以上可以看出,lxml可以正確解析兩側缺失的括號,并閉合標簽,但不會額外增加<html>和<body>標簽。

          二、處理lxml解析出來的html內容

          若在html中找到我們想要的內容,用lxml有幾種不同的方法,XPath選擇器類似Beautiful Soup的find()方法。CSS選擇器用法和jQuery中的選擇器類似。兩種選擇器都可以用來查找文檔中的元素,但它們各有特點和適用場景。XPath是一種在XML文檔中查找信息的語言。它可以用來遍歷XML文檔的元素和屬性。CSS選擇器通常用于選擇和操作HTML文檔中的元素。

          1、XPath選擇器(/單斜杠表示絕對查找,//雙斜杠表示相對查找)

          from lxml import etree
          source_html="""
                   <div>
                      <ul>
                           <li class="item-0"><a href="link1.html">first item</a></li>
                           <li class="item-1"><a href="link2.html">second item</a></li>
                           <li class="item-inactive"><a href="link3.html">third item</a></li>
                           <li class="item-1"><a href="link4.html">fourth item</a></li>
                           <li class="item-0"><a href="link5.html">fifth item</a>
                       </ul>
                   </div>
                  """
          html=etree.HTML(source_html)
          print(html)
          result=etree.tostring(html)#會對的html標簽進行補全
          print(result.decode("utf-8"))

          輸出結果:

          <Element html at 0x39e58f0>
          <html><body><div>
          <ul>
          <li class="item-0"><a href="link1.html">first item</a></li>
          <li class="item-1"><a href="link2.html">second item</a></li>
          <li class="item-inactive"><a href="link3.html">third item</a></li>
          <li class="item-1"><a href="link4.html">fourth item</a></li>
          <li class="item-0"><a href="link5.html">fifth item</a>
          </li></ul>
          </div>
          </body></html>

          1)獲取某個標簽的內容(a標簽后不需要加斜杠,否則會報錯)

          #第一種寫法

          html=etree.HTML(source_html)
          html_data=html.xpath('/html/body/div/ul/li/a')#絕對查找
          #html_data=html.xpath('//li/a')#相對查找
          print(html)
          for i in html_data:
              print(i.text)
          

          輸出結果:

          <Element html at 0x14fe6b8>
          first item
          second item
          third item
          fourth item
          fifth item

          #第二種寫法
          #在要找的標簽后面加/text(),就是獲取標簽中的文本內容,結果中直接就是文本內容了,不用在通過text屬性獲取了。

          html=etree.HTML(source_html)
          html_data=html.xpath('/html/body/div/ul/li/a/text()')#絕對查找
          #html_data=html.xpath('//li/a/text()')#相對查找
          print(html)
          for i in html_data:
              print(i)

          輸出結果:

          <Element html at 0x128e3b7>
          first item
          second item
          third item
          fourth item
          fifth item

          2)獲取a標簽下的屬性

          html=etree.HTML(source_html)
          html_data=html.xpath('//li/a/@href') #相對查找
          #html_data=html.xpath('/html/body/div/ul/li/a/@href') #絕對查找
          for i in html_data:
              print(i)
          

          輸出結果:

          link1.html
          link2.html
          link3.html
          link4.html
          link5.html

          3)查找a標簽屬性等于link2.html的內容

          html=etree.HTML(source_html)
          html_data=html.xpath('/html/body/div/ul/li/a[@href="link2.html"]/text()')絕對查找
          #html_data=html.xpath('//li/a[@href="link2.html"]/text()')#相對查找
          print(html_data)
          for i in html_data:
              print(i)
          

          輸出結果:

          ['second item']
          second item

          4)查找最后一個li標簽里的a標簽的href屬性

          html=etree.HTML(source_html)
          html_data=html.xpath('//li[last()]/a/text()')
          print(html_data)
          for i in html_data:
              print(i)
          

          輸出結果:

          ['fifth item']
          fifth item

          5)查找倒數第二個li標簽里a標簽的href屬性

          html=etree.HTML(source_html)
          html_data=html.xpath('//li[last()-1]/a/text()')
          print(html_data)
          for i in html_data:
              print(i)
          

          輸出結果:

          ['fourth item']
          fourth item

          6)查找某個標簽id屬性值等于value的標簽

          //*[@id="value"]

          7)使用chrome瀏覽器提取某個標簽的XPath

          2、CSS選擇器(基本上和jQuery選擇器用法一樣)

          選擇器

          描述

          *

          選擇所有標簽

          a

          選擇<a>標簽

          .link

          選擇所有class='link'的元素

          a.link

          選擇class='link'的<a>標簽

          a#home

          選擇id='home'的<a>標簽

          a > span

          選擇父元素為<a>標簽的所有<span>子標簽

          a span

          選擇<a>標簽內部的所有<span>標簽

          使用示例:

          >>> html="""<div>
          <tr id="places_area_row" class="body">
          <td>header</td>
          <td class="w2p_fw">item1</td>
          <td class="w2p_fw">item2</td>
          <td class="w2p_fw">item3</td>
          <td><tr><td class="w2p_fw">header</td>
          <td class="w2p_fw">item4</td>
          <td class="w2p_fw">item5</td>
          <td class="w2p_fw">item6</td></tr></td>
          </tr>
          </div>"""
          >>> tree=lxml.html.fromstring(html)
          >>> td=tree.cssselect('tr#places_area_row > td.w2p_fw')[0]
          >>> htmlText=td.text_content()
          >>> print htmlText
          item1

          參考文檔:https://www.cjavapy.com/article/65/

          ?


          主站蜘蛛池模板: 一区二区三区福利| 熟女少妇精品一区二区| 一区二区三区免费高清视频| 中文字幕日韩精品一区二区三区| 亚洲永久无码3D动漫一区| 一级特黄性色生活片一区二区| 久久久老熟女一区二区三区| 亚洲午夜精品一区二区麻豆| 国产成人无码一区二区在线播放| 久久精品一区二区东京热| 福利一区福利二区| 国产免费一区二区三区VR| 在线精品动漫一区二区无广告| 秋霞鲁丝片一区二区三区| 熟妇人妻系列av无码一区二区| 午夜视频在线观看一区二区| 国产亚洲一区二区三区在线不卡 | 无码乱人伦一区二区亚洲| 无码少妇精品一区二区免费动态| 合区精品久久久中文字幕一区| 国产精品一区二区四区| 久久久久99人妻一区二区三区| 一本AV高清一区二区三区| 一本大道东京热无码一区| 婷婷国产成人精品一区二| 国产91精品一区二区麻豆亚洲| 一区二区三区免费视频观看| 国产综合无码一区二区辣椒| 国产免费无码一区二区| 无码AV中文一区二区三区| 精品无码成人片一区二区98| 无码欧精品亚洲日韩一区夜夜嗨 | 国产午夜精品一区二区三区小说| 国产免费播放一区二区| 亚洲一区二区三区高清不卡| 不卡一区二区在线| 无码人妻精品一区二区三区东京热| 欧洲无码一区二区三区在线观看 | 亚洲一本一道一区二区三区 | 日本免费一区二区三区四区五六区 | 久久精品免费一区二区|