導航:首頁 > 編程語言 > pythonlxml使用

pythonlxml使用

發布時間:2023-07-07 22:25:18

A. 問題如圖所示(用python,解答全過程)

安裝必要的庫和工具:requests, BeautifulSoup4, lxml, openpyxl
python
Copy code
pip install requests beautifulsoup4 lxml openpyxl
發送 GET 請求,獲取網頁源代碼
python
Copy code
import requests
url = "https://ssr1.scrape.center/"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36"
}
response = requests.get(url, headers=headers)
html = response.text
使用 BeautifulSoup 解析網頁源代碼,提取所需欄位
python
Copy code
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "lxml")
items = soup.find_all("div", class_="item")
for item in items:
title = item.find("h2").text.strip()
url = item.find("a")["href"]
cover = item.find("img")["纖陸src"]
category = item.find("div", class_="categories").a.text.strip()
published_at = item.find("div", class_="published-at").text.strip()
# 將結果保存到 Excel 文件
使用 openpyxl 庫將結果保存到 Excel 文件中
python
Copy code
from openpyxl import Workbook
workbook = Workbook()
sheet = workbook.active
sheet.title = "Scraped Data"
# 寫入表頭
sheet.append(["Title", "URL", "Cover", "Category", "Published At"])
# 寫入數據
for item in items:
title = item.find("h2").text.strip()
url = item.find("a")["href"]
cover = item.find("img")["src"]
category = item.find("div", class_="categories").a.text.strip()
published_at = item.find("div", class_="published-at").text.strip()
row = [title, url, cover, category, published_at]
sheet.append(row)
# 保存 Excel 文件
workbook.save("scraped_data.xlsx")
以上就是一個簡單的 Python 爬蟲實現,可以將網頁中的數據提取出來,存儲到睜枝 Excel 文件中。需要注意的是,網站可能會有反爬蟲機制,為了避免被封 IP,建議使毀早頃用代理 IP、隨機 User-Agent 等措施。

B. 如何用產品id索引爬取標簽內的產品各項標題鏈接價格 python

產品id索引爬取標簽內的產品各項標題鏈接價格 python可以使用網頁請求方式:最常見的方式,一般用於獲取或者查詢資源信息,也是大多數網站使用的方式,響應速度快,或者多以表單形式上傳參數,因此除了查詢信息外,還可以修改信息。

另外可以以開發者的身份進入網站進行價格查詢,打開網頁,用開發者模式,任意復制一條首條新聞標題,粘貼到搜索框里。開發者模式,依次點擊『network』,『XHR』找到翻譯數據,點擊Headers,請求為get方式,使用Beautiful soup解析網頁,然後再安裝bs。

Beautiful soup 指定xlml解析器進行解析,soup=BeautifulSoup(strhtml.text,'lxml'使用select(選擇器)定位數據,使用瀏覽器的開發者模式,將滑鼠停留在對應數據位置並右擊。

開發者界面會有被選中部分,右擊 ---> selector; 將路徑粘貼在文檔中,代碼如下#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li:nth-child(1) > a。

這是選中的第一條路徑,但我們要獲取所有的新聞頭條,因此將:li:nth-child(1)中冒號(包含冒號)後面的刪掉。如下:#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li > a,然後就可以直接查詢了。

C. python中lxml這個庫主要是干什麼的

1、lxml是XML和HTML的解析器,
2、其主要功能是解析和提取XML和HTML中的數據;
3、lxml和正則一樣,也是用C語言實現的,是一款高性能的python HTML、XML解析器,也可以利用XPath語法,來定位特定的元素及節點信息

D. python使用xpath(超詳細)

使用時先安裝 lxml 包

開始使用 #

和beautifulsoup類似,首先我們需要得到一個文檔樹

把文本轉換成一個文檔樹對象

from lxml import etreeif __name__ == '__main__':doc='''

把文件轉換成一個文檔樹對象

fromlxmlimportetree# 讀取外部文件 index.htmlhtml = etree.parse('./index.html')result = etree.tostring(html, pretty_print=True)#pretty_print=True 會格式化輸出print(result)

均會列印出文碧態檔內容

節點、元素、屬性、內容 #

xpath 的思想是通過 路徑表達 去尋找節點。節點包括元素,屬性,和內容

元素舉例

html --->...div --->

這里我們可以看到,這里的元素和html中的標簽一個意思。單獨的元素是無法表達一個路徑的,所以單獨的元素不能獨立使用

路徑表達式 #

/  根節點,節點分隔符,//  任意位置.  當前節點..  父級節點@  屬性

通配符 #

*  任意元素@*  任意屬性node()  任意子節點(元素,屬性,內悔老源容)

謂語 #

使用中括弧來限定元素,稱為謂語

//a[n] n為大於零的整數,代表子元素排在第n個位置的 元素//a[last()]  last()  代表子元素排在最後個位置的 元素//a[last()-]  和上面同理,代表倒數第二個//a[position()<3] 位置序號小於3,也就是前兩個,這里我們可以看出xpath中的序列是從1開始//a[@href]    擁有href的 元素//a[@href='www..com']    href屬性值為'www..com'的 元素//book[@price>2]  price值大於2的元素

多個路含蠢徑 #

用| 連接兩個表達式,可以進行 或匹配

//book/title | //book/price

函數 #

xpath內置很多函數。更多函數查看 https://www.w3school.com.cn/xpath/xpath_functions.asp

contains(string1,string2)

starts-with(string1,string2)

ends-with(string1,string2) #不支持

upper-case(string) #不支持

text()

last()

position()

node()

可以看到last()也是個函數,在前面我們在謂語中已經提到過了

案例 #

定位元素 #

匹配多個元素,返回列表

fromlxmlimportetreeif__name__ =='__main__':doc='''

【結果為】

[<Element li at 0x2b41b749848>, <Element li at 0x2b41b749808>, <Element li at 0x2b41b749908>, <Element li at 0x2b41b749948>, <Element li at 0x2b41b749988>][]  #沒找到p元素

html = etree.HTML(doc)print(etree.tostring(html.xpath("//li[@class='item-inactive']")[0]))print(html.xpath("//li[@class='item-inactive']")[0].text)print(html.xpath("//li[@class='item-inactive']/a")[0].text)print(html.xpath("//li[@class='item-inactive']/a/text()"))print(html.xpath("//li[@class='item-inactive']/.."))print(html.xpath("//li[@class='item-inactive']/../li[@class='item-0']"))

【結果為】

b' third item \n                'None    #因為第三個li下面沒有直接text,Nonethird item  #['third item'][<Element ul at 0x19cd8c4c848>][<Element li at 0x15ea3c5b848>, <Element li at 0x15ea3c5b6c8>]

使用函數 #

contains #

有的時候,class作為選擇條件的時候不合適@class='....' 這個是完全匹配,當王爺樣式發生變化時,class或許會增加或減少像active的class。用contains就能很方便

from lxml import etreeif __name__ == '__main__':doc='''

【結果為】

[<Element p at 0x23f4a9d12c8>, <Element li at 0x23f4a9d13c8>, <Element li at 0x23f4a9d1408>, <Element li at 0x23f4a9d1448>, <Element li at 0x23f4a9d1488>]

starts-with #

from lxml import etreeif __name__ == '__main__':doc='''

【結果為】

[<Element ul at 0x23384e51148>, <Element p at 0x23384e51248>, <Element li at 0x23384e51288>, <Element li at 0x23384e512c8>, <Element li at 0x23384e51308>, <Element li at 0x23384e51388>][<Element ul at 0x23384e51148>]

ends-with #

print(html.xpath("//*[ends-with(@class,'ul')]"))

【結果為】

Traceback (most recent call last):File"F:/OneDrive/pprojects/shoes-show-spider/test/xp5_test.py",line18,inprint(html.xpath("//*[ends-with(@class,'ul')]"))File"src\lxml\etree.pyx",line1582,inlxml.etree._Element.xpathFile"src\lxml\xpath.pxi",line305,inlxml.etree.XPathElementEvaluator.__call__File"src\lxml\xpath.pxi",line225,inlxml.etree._XPathEvaluatorBase._handle_resultlxml.etree.XPathEvalError: Unregisteredfunction

看來python的lxml並不支持有的xpath函數列表

upper-case #

和ends-with函數一樣,也不支持。同樣報錯lxml.etree.XPathEvalError: Unregistered function

print(html.xpath("//a[contains(upper-case(@class),'ITEM-INACTIVE')]"))

text、last #

#最後一個li被限定了print(html.xpath("//li[last()]/a/text()"))#會得到所有的`<a>`元素的內容,因為每個<a>標簽都是各自父元素的最後一個元素。#本來每個li就只有一個<a>子元素,所以都是最後一個print(html.xpath("//li/a[last()]/text()"))print(html.xpath("//li/a[contains(text(),'third')]"))

【結果為】

['fifth item']['second item', 'third item', 'fourth item', 'fifth item'][<Element a at 0x26ab7bd1308>]

position #

print(html.xpath("//li[position()=2]/a/text()"))#結果為['third item']

上面這個例子我們之前以及講解過了

* 這里有個疑問,就是position()函數能不能像text()那樣用呢

print(html.xpath("//li[last()]/a/position()"))#結果  lxml.etree.XPathEvalError: Unregisteredfunction

這里我們得到一個結論,函數不是隨意放在哪裡都能得到自己想要的結果

node #

返回所有子節點,不管這個子節點是什麼類型(熟悉,元素,內容)

print(html.xpath("//ul/li[@class='item-inactive']/node()"))print(html.xpath("//ul/node()"))

【結果為】

[]['\n                ', , '\n                ', , '\n                ', , '\n                ', , '\n                ', , ' 閉合標簽\n            ']

獲取內容 #

**剛剛已經提到過,可以使用.text和text()的方式來獲取元素的內容

from lxml import etreeif __name__ == '__main__':doc='''

【結果為】

['first item','second item','third item','fourth item','fifth item']first item18['\n                ','\n                ','\n                ','\n                ','\n                ',' 閉合標簽\n            ']

看到這里,我們觀察到text()和.text的區別。自己總結吧。不太好表達,就不表達了

獲取屬性 #

print(html.xpath("//a/@href"))print(html.xpath("//li/@class"))

【結果為】

['link1.html', 'link2.html', 'link3.html', 'link4.html', 'link5.html']['item-0active', 'item-1', 'item-inactive', 'item-1', 'item-0']

自定義函數 #

我們從使用函數的過程中得到結論,就是有的函數不支持,有的支持,那問題來了,到底那些方法支持呢。我們在lxml官網找到了答案。 https://lxml.de/xpathxslt.html 。lxml 支持XPath 1.0 ,想使用其他擴展,使用libxml2,和libxslt的標准兼容的方式。 XPath 1.0官方文檔  以及其他版本的XPath文檔  https://www.w3.org/TR/xpath/

lxml supports XPath1.0, XSLT1.0andthe EXSLT extensions through libxml2andlibxsltina standards compliant way.

除此之外,lxml還提供了自定義函數的方式來擴展xpath的支持度  https://lxml.de/extensions.html

from lxml import etree#定義函數def ends_with(context,s1,s2):return s1[0].endswith(s2)if __name__ == '__main__':doc='''

【結果為】

[<Element li at 0x2816ed30548>, <Element li at 0x2816ed30508>]['first item', 'third item']

形參s1會傳入xpath中的第一個參數@class,但這里注意@class是個列表

形參s2會傳入xpath中的第二個參數'active','active'是個字元串

官網例子 https://lxml.de/extensions.html

defhello(context, a):return"Hello %s"% afromlxmlimportetreens = etree.FunctionNamespace(None)ns['hello'] = helloroot = etree.XML('<a><b>Haegar</b></a>')print(root.xpath("hello('Dr. Falken')"))# 結果為 Hello Dr. Falken

E. PyCharm python3.9,from lxml import etree報錯

問題:PyCharm python3.9,from lxml import etree報錯,報錯內容:ImportError: DLL load failed while importing etree: 找不到指定的程序。

解決辦法(在PyCharm中 更換python3.7和lxml==4.6.5版本 ):

終端:pip install lxml==4.6.5

注意一點:當出現ImportError: cannot import name 'etree' from 'lxml'報神橋錯時,查看一下春碼自己有沒有游森猛命名為lxml.py的文件,修改為其它的名稱即可。

F. python參數如果是xml字元串,該怎麼寫

調用Python腳本時傳遞XML字元串作為參數可能會導致錯誤,因為某些特殊字元可能被操作系統或Python解釋器解釋為命令或代碼。為配備升了避免這個問題,可以將XML字元串作為滾枝一個文本文件傳遞,或者使用base64編碼將字元串編碼為非特殊字元。下面是兩種方法的示例。

方法一:將XML字元串保存到文件,並將文件名作為參數傳遞:

import sys

import xml.etree.ElementTree as ET

filename = sys.argv[1]

with open(filename, 'r') as file:

xml_string = file.read()

xml_root = ET.fromstring(xml_string)

import base64

xml_string = '<?xml version="1.0" encoding="UTF-8"?>...'

encoded_xml = base64.b64encode(xml_string.encode()).decode()

import sys

import base64

import xml.etree.ElementTree as ET

encoded_xml = sys.argv[1]

decoded_xml = base64.b64decode(encoded_xml.encode()).decode()

xml_root = ET.fromstring(decoded_xml)

G. Python lxml包下面的xpath基本用法

對於網頁數據抓取,有BeautifulSoup、lxml以及正則表達式三種方法,其中正則表達式過於復雜,而beautifulsoup和lxml使用起來較為方便。以前簡單使用過beautifulsoup(美味湯),後面為了擴展一下,熟悉一下lxml進行數據抓取。

先貼一個lxml的簡仿早單框架:

其中,最主要的在於xpath路徑的獲取和解析,而XPath就是地址,具體地,就是需要知道所要尋找的內容處在哪個地址下。一般而言,我們可以根據開發者工具來定位我們需要的元素,然後右擊選擇其所在xpath,選擇初步的路徑,如下圖所示,

這只是一種簡單的方法,更重要的,需要掌握xpath的語法規則,下面分別論述。

使用xpath獲取信息,主要包括獲取本文和獲取屬性,基本用法為

對比可以看出,一個是採用text()獲取文本,一個是採用@屬性獲取屬性值。而前面標簽後面方括弧就是來對標簽進行篩選的。一般而言,通過選擇器可以獲取諸如/html/body/div[@class="useful"]/ul/li/text()的信息,但是開頭的信息沒有標志性,採用//div[@class="useful"]/ul/li/text()即可。

這個地方即涉及到了xpath的語法選擇,主要包括以下幾點:

而在選擇器方備緩雀面,包括以下幾個

除此之外,在獲取了一個元素之後,我們需要獲取其下面元素的屬性,即要對基於xpath獲取的元素再次採用xpath,此時的獲取方式為:

另外,我們也可以獲取節點下面所有的字元串,方法為string(.),示例為:

懶得打字了,下面的截圖來自W3Cschool, https://www.w3cschool.cn/lxml/_lxml-98h23fk0.html

主要的Xpath運算符包括以下:

按順序選擇等進一步的內容可以移步 https://www.w3cschool.cn/lxml/_lxml-eh1k3fk6.html

具體到不同的網頁上,需要的其他哪陸知識就更多了,慢慢補充吧。不過似乎還是beautifulsoup好用一些,哈哈。

參考資料:
https://blog.csdn.net/weixin_39851008/article/details/109960957
https://www.w3cschool.cn/lxml/_lxml-98h23fk0.html

H. Python3.10版 Win1064位無法安裝lxml庫

在練習xpath時,需要安裝lxml模塊,報錯需要 Microsoft Visual C++ 14.0 吐槽一些教程:pip install wheel,安裝無效果的 環境 window 10 python3 重裝系統後,安裝了最新的Python3.8.1,當使用pip安裝lxml庫的時候報錯Microsoft Visual C++ 14.0 is required,

前提是:1.已安裝python,2. 已安裝好pip,3.已將python安裝目錄下的scripts目錄(如D:\Python35\Scripts)添加到系統環境變數path里。

方法一:打開cmd,輸入pip install lxml。如果安裝成功的話,可以不用往下看了,人品太好了。通常呢,都會遇到各種錯誤,不是這不對,就是那裡錯,反正就是各種安裝不了。

方絕螞含法二:基本上,進到這里來看的人,應該都是已經掉到坑裡的,所以直接從這里看起就可以。推並笑薦通過物宴lxml的.whl文件來進行安裝。

I. python中lxml模塊怎麼導入

這個模塊是第三方模塊,需要先安裝再導入。

安裝:終端命令界面下,pip install lxml(安裝過程中如果提示需要其他哪個庫,需要先裝提示的庫,再裝lxml)。
如果使用pip安裝失敗,到pypi社區官網下載壓縮解壓,終端界面進入其目錄(當前目錄有個叫「setup.py」就對了),用命令 python setup install 就行。

導入:import lxml 即可

閱讀全文

與pythonlxml使用相關的資料

熱點內容
安卓手機emoji扁平怎麼辦 瀏覽:208
歐版三星s20怎麼升級安卓11 瀏覽:104
我的世界伺服器如何拉黑房子 瀏覽:480
linux伺服器網路設置 瀏覽:106
在線編譯代碼怎麼做 瀏覽:205
社會研究方法教程pdf 瀏覽:696
cad修改伺服器地址 瀏覽:788
新手伺服器裝什麼系統好 瀏覽:128
androidxmlui 瀏覽:713
星辰之戀在哪個app播 瀏覽:465
手機卡伺服器出錯誤是怎麼回事 瀏覽:536
cg編譯器怎麼設置 瀏覽:418
單片機教學視頻哪個好 瀏覽:598
編譯器錯誤了怎麼辦 瀏覽:77
看摩托車用什麼app好 瀏覽:405
pdf轉換excel在線轉換 瀏覽:361
php多客服 瀏覽:746
語言編譯程序如何分類 瀏覽:377
pdf下載哪個 瀏覽:77
北京防遺失加密狗地址 瀏覽:534