ตามที่ฉันได้กล่าวไว้ในความคิดเห็นของฉันโดยทั่วไปไม่ควรแยก HTML ด้วยนิพจน์ทั่วไป แต่บางครั้งคุณก็สามารถหลีกเลี่ยงได้หาก HTML ที่คุณกำลังแยกวิเคราะห์นั้นมีความประพฤติดี
เพื่อให้ได้เฉพาะ URL ที่อยู่ในhref
คุณสมบัติของ<a>
องค์ประกอบฉันพบว่ามันง่ายที่สุดในการทำหลายขั้นตอน จากความคิดเห็นของคุณดูเหมือนว่าคุณต้องการโดเมนระดับบนสุดเท่านั้นไม่ใช่ URL แบบเต็ม ในกรณีนี้คุณสามารถใช้สิ่งนี้:
grep -Eoi '<a [^>]+>' source.html |
grep -Eo 'href="[^\"]+"' |
grep -Eo '(http|https)://[^/"]+'
โดยที่source.html
เป็นไฟล์ที่มีรหัส HTML ที่จะแยกวิเคราะห์
รหัสนี้จะพิมพ์ URL ระดับบนสุดทั้งหมดที่เกิดขึ้นเป็นhref
แอตทริบิวต์ของ<a>
องค์ประกอบใด ๆในแต่ละบรรทัด -i
ตัวเลือกที่จะเป็นครั้งแรกที่grep
คำสั่งเพื่อให้แน่ใจว่ามันจะทำงานได้ทั้งบน<a>
และ<A>
องค์ประกอบ ฉันเดาว่าคุณสามารถให้-i
อันดับที่ 2 grep
ในการจับHREF
คุณสมบัติตัวพิมพ์ใหญ่ OTOH ฉันต้องการละเว้น HTML ที่เสียหายเช่นนั้น :)
เพื่อประมวลผลเนื้อหาของ http://google.com/
wget -qO- http://google.com/ |
grep -Eoi '<a [^>]+>' |
grep -Eo 'href="[^\"]+"' |
grep -Eo '(http|https)://[^/"]+'
เอาท์พุต
http://www.google.com.au
http://maps.google.com.au
https://play.google.com
http://www.youtube.com
http://news.google.com.au
https://mail.google.com
https://drive.google.com
http://www.google.com.au
http://www.google.com.au
https://accounts.google.com
http://www.google.com.au
https://www.google.com
https://plus.google.com
http://www.google.com.au
ผลลัพธ์ของฉันแตกต่างจากตัวอย่างเล็กน้อยเล็กน้อยเมื่อฉันถูกเปลี่ยนเส้นทางไปยังหน้า Google ของออสเตรเลีย