2024 高级爬虫笔记(一)bs4和xpath使用教程-二、数据解析利器——xpath

2.1、xpath安装 pip install lxml

2.2、快速使用

  # 解析网络的html字符串
  html_tree = etree.HTML(html字符串)
  html_tree.xpath()
  使用xpath路径查询信息,返回一个列表

2.3、xpath语法

2.3.1、路径表达式:

  | /    | 从根节点选取。                       |
  | //   | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
  | ./   | 当前节点再次进行xpath                 |
  | @    | 选取属性。                         |

  在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:
  | /html               | 选取根元素。 |
  | //li                | 选取所有li 子元素,而不管它们在文档中的位置。                |
  | //ul//li            | 选择属于 ul元素的后代的所有 li元素,而不管它们位于 ul之下的什么位置。  |
  | 节点对象.xpath('./div') | 选择当前节点对象里面的第一个div节点                      |
  | //@href             | 选取名为 href 的所有属性。                         |

2.3.2、谓语(Predicates):

  谓语用来查找某个特定的节点或者包含某个指定的值的节点。
  谓语被嵌在方括号中。

  在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:
  | 路径表达式                              | 结果                                       |
  | /ul/li[1]                          | 选取属于 ul子元素的第一个 li元素。                     |
  | /ul/li[last()]                     | 选取属于 ul子元素的最后一个 li元素。                    |
  | /ul/li[last()-1]                   | 选取属于 ul子元素的倒数第二个 li元素。                   |
  | //ul/li[position()<3]              | 选取最前面的两个属于 ul元素的子元素的 li元素。               |
  | //a[@title]                        | 选取所有拥有名为 title的属性的 a元素。                  |
  | //a[@title='xx']                   | 选取所有 a元素,且这些元素拥有值为 xx的 title属性。          |
  | //a[@title>10]   `> < >= <= !=`    | 选取 a元素的所有 title元素,且其中的 title元素的值须大于 10|
  | /bookstore/book[price>35.00]/title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00|

2.3.3、选取未知节点:

  XPath 通配符可用来选取未知的 XML 元素。
  | 通配符    | 描述                              |
  | *      | 匹配任何元素节点。  一般用于浏览器copy xpath会出现 |
  | @*     | 匹配任何属性节点。                       |
  | node() | 匹配任何类型的节点。                      |

  在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
  | 路径表达式       | 结果                  |
  | /ul/*       | 选取 ul元素的所有子元素。      |
  | //*         | 选取文档中的所有元素。         |
  | //title[@*] | 选取所有带有属性的 title 元素。 |
  | //node()    | 获取所有节点              |

2.3.4、选取若干路径:

  通过在路径表达式中使用“|”运算符,您可以选取若干个路径。

  在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
  | 路径表达式                            | 结果                                       |
  | //book/title | //book/price     | 选取 book 元素的所有 title 和 price 元素。          |
  | //title | //price               | 选取文档中的所有 title 和 price 元素。               |
  | /bookstore/book/title | //price | 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。 |

2.3.5、逻辑运算

  查找所有id属性等于head并且class属性等于s_down的div标签
    //div[@id="head" and @class="s_down"]

  选取文档中的所有 title 和 price 元素。
   //title | //price

  注意:|”两边必须是完整的xpath路径

2.3.6、属性查询

  查找所有包含id属性的div节点
    //div[@id]

  查找所有id属性等于maincontent的div标签
   //div[@id="maincontent"]

  查找所有的class属性
   //@class
   
  获取li标签中name为xx的里面的文本内容
   //li[@name="xx"]//text()  

2.3.7、查询相关

  查询所有id属性中包含he的div标签
    //div[contains(@id, "he")]

  查询所有id属性中包以he开头的div标签
   //div[starts-with(@id, "he")]

  查找所有div标签下的直接子节点h1的内容
  //div/h1/text()

2.3.8、获取节点内容转换成字符串

  c = tree.xpath('//li/a')[0]
  result=etree.tostring(c, encoding='utf-8')
  print(result.decode('UTF-8'))
上一篇:单体架构 IM 系统核心业务功能实现


下一篇:AI Prompt 提示词的5大经典模型